#ifndef SPROOUT_H
#define SPROOUT_H

/* 声明 */

struct Value;
enum Type;
struct Object;

typedef enum Type Type;
typedef struct Value Value;
typedef struct Object Object;
typedef struct Object Array;

/**
 * Object 对象转化为 JSON object
 *
 * @param obj Object 对象指针
 * @return JSON 字符串
 */
char *c_object_to_json_object(const Object *obj);

/**
 * JSON object 转化为 Object 对象
 *
 * @param js JSON 字符串指针的指针
 * @return Object 对象指针
 */
Object *json_object_to_c_object(const char **js);

/**
 * Array 对象转化为 JSON array
 *
 * @param arr Array 对象指针
 * @return JSON 字符串
 */
char *c_array_to_json_array(const Array *arr);

/**
 * JSON array 转化为 Array 对象
 *
 * @param js JSON 字符串指针的指针
 * @return Array 对象指针
 */
Array *json_array_to_c_array(const char **js);

/**
 * c 字符串转化为 JSON string
 *
 * @param str c 字符串
 * @return JSON 字符串
 */
char *c_string_to_json_string(const char *str);

/**
 * JSON string 转化为 c 字符串
 *
 * @param js JSON 字符串指针的指针
 * @return c 字符串
 */
char *json_string_to_c_string(const char **js);

/**
 * 释放 Object
 *
 * @param obj Object
 */
void free_object(Object *obj);

/**
 * 释放 Array
 *
 * @param arr Array
 */
void free_array(Array *arr);

/**
 * 释放 Value
 *
 * @param v Value
 */
void free_value(Value *v);

/**
 * 释放字符串
 *
 * @param v 字符串
 */
void free_string(char *v);

/* 定义 */

enum Type
{
    J_OBJECT, // object
    J_ARRAY,  // array
};

struct Value
{
    char *k;
    void *v;
    Type t;
    Value *next;
};

struct Object
{
    Value *value;
};

/* 常量 */

#define LEFT_BRACE '{'
#define RIGHT_BRACE '}'
#define SPACE ' '
#define LINEFEED '\n'
#define CARRIAGE_RETURN '\r'
#define HORIZONTAL_TAB '\t'
#define LEFT_BRACKET '['
#define RIGHT_BRACKET ']'
#define DOUBLE_QUOTE '"'
#define NULL_CHARACTER '\0'
#define HIGH_SURROGATE_LOWER 0xD800
#define HIGH_SURROGATE_UPPER 0xDBFF
#define LOW_SURROGATE_LOWER 0xDC00
#define LOW_SURROGATE_UPPER 0xDFFF
#define COMMA ','

#endif
